/**
 * API错误处理工具
 * 用于统一处理API调用中的业务错误和系统错误
 * @author Wu.Liang
 * @date 2025-01-30
 */

import { handleBusinessError } from './businessErrorHandler'

/**
 * API错误处理结果
 */
export interface ApiErrorResult {
  isBusinessError: boolean
  isSystemError: boolean
  message: string
  shouldShowMessage: boolean
}

/**
 * 处理API错误
 * @param error 错误对象
 * @param defaultMessage 默认错误消息
 * @param showMessage 是否显示消息提示
 * @returns 错误处理结果
 */
export function handleApiError(
  error: any, 
  defaultMessage: string = '操作失败', 
  showMessage: boolean = true
): ApiErrorResult {
  // 检查是否是业务错误
  if (error && typeof error === 'object' && error.isBusinessError) {
    // 业务错误已经在拦截器中处理了，这里不需要额外处理
    console.log('业务错误已处理:', error.message)
    return {
      isBusinessError: true,
      isSystemError: false,
      message: error.message,
      shouldShowMessage: false // 业务错误已经在拦截器中显示了
    }
  }
  
  // 系统错误
  console.error('系统错误:', error)
  if (showMessage) {
    handleBusinessError(defaultMessage, {
      showMessage: true,
      showNotification: false,
      logToConsole: false
    })
  }
  
  return {
    isBusinessError: false,
    isSystemError: true,
    message: error?.message || defaultMessage,
    shouldShowMessage: showMessage
  }
}

/**
 * 处理API调用的便捷函数
 * @param apiCall API调用函数
 * @param errorMessage 错误消息
 * @param showMessage 是否显示消息
 * @returns Promise结果
 */
export async function handleApiCall<T>(
  apiCall: () => Promise<T>,
  errorMessage: string = '操作失败',
  showMessage: boolean = true
): Promise<T | null> {
  try {
    return await apiCall()
  } catch (error) {
    const result = handleApiError(error, errorMessage, showMessage)
    return null
  }
}

/**
 * 处理API调用的便捷函数（带默认值）
 * @param apiCall API调用函数
 * @param defaultValue 默认值
 * @param errorMessage 错误消息
 * @param showMessage 是否显示消息
 * @returns Promise结果
 */
export async function handleApiCallWithDefault<T>(
  apiCall: () => Promise<T>,
  defaultValue: T,
  errorMessage: string = '操作失败',
  showMessage: boolean = true
): Promise<T> {
  try {
    return await apiCall()
  } catch (error) {
    const result = handleApiError(error, errorMessage, showMessage)
    return defaultValue
  }
}

export default {
  handleApiError,
  handleApiCall,
  handleApiCallWithDefault
}
